﻿using System;
using System.Linq;
using System.Web.Mvc;
using ContactManagement.AppCode;
using ContactManagement.Models;
using ContactMvc4TB.Helpers.HelperClasses;
using EFDataModel;
using EFDataModel.Enums;

namespace ContactMvc4TB.Helpers.CategoryManagement
{
    /// <summary>
    /// Verwalten der Dynamischen Datentypkategorien
    /// </summary>
    public class WebDynamicDataTypeCategories : CategoryBase
    {
        #region Static
        /// <summary>
        /// Singleton Pattern für die aktuelle WebUserCategorie
        /// </summary>
        /// <param name="controller">Der Aktuelle CurrentController</param>
        /// <returns>Instanz der aktuellen WebUserKategorie</returns>
        public static WebDynamicDataTypeCategories DynamicDataTypeCategories(Controller controller)
        {
            return new WebDynamicDataTypeCategories(controller);
        }
        #endregion

        #region Member
        /// <summary>
        /// Der Aktuelle CurrentController, damit auch auf die Tempdaten und alles notwendige zugegriffen werden kann
        /// </summary>
        protected override sealed Controller CurrentController { get; set; }
        #endregion

        #region Konstruktor
        /// <summary>
        /// Initialisieren der WebUserKategorien
        /// </summary>
        /// <param name="controller"></param>
        public WebDynamicDataTypeCategories(Controller controller)
        {
            CurrentController = controller;
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Hinzufügen eines Eintrages zur Kategorie
        /// </summary>
        /// <param name="model"></param>
        /// <returns>TRUE->Erfolgreich angelegt | FALSE->Fehler beim Löschen</returns>
        public override bool Add(CategoriesAddModel model)
        {
            try
            {
                //Prüfen ob der Name bereits vergeben wurde.
                var count = (from eDataTypeCategory in CurrentHttpContext.GetDataModel().EFCategoryMenge.OfType<DynamicDataTypeCategory>() where eDataTypeCategory.Name == model.Name select eDataTypeCategory).Count();
                if(count > 0)
                {
                    CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.DynamicDataTypeNameInUseRESX,MessageTypes.error);
                }
                else
                {
                    //Erstellen und Speichern des Eintrages
                    DynamicDataTypeCategory dynamicDataTypeCategory = new DynamicDataTypeCategory();
                    dynamicDataTypeCategory.IsSystem = false;
                    dynamicDataTypeCategory.Name = model.Name;
                    dynamicDataTypeCategory.SortId = model.SortId;
                    dynamicDataTypeCategory.EFModule = EFModules.DynamicData;
                    dynamicDataTypeCategory.EFCategoryType = EFCategoryTypes.DynamicDataTypeCategory;
                    CurrentHttpContext.GetDataModel().EFCategoryMenge.Add(dynamicDataTypeCategory);
                    CurrentHttpContext.GetDataModel().SaveChanges();    
                }
            }
            catch (Exception)
            {
                //Fehler Beim Anlegen des Eintrags
                CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.AddValueErrorRESX, MessageTypes.error);
                return false;
            }

            //Der Eintrag konnte erfolgreich angelegt werden
            CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.AddValueSuccessfullRESX, MessageTypes.ok);
            return true;
        }

        /// <summary>
        /// Löschen der übergebenen Kategorie Id
        /// </summary>
        /// <param name="id">die Kategorie Id die gelöscht werden soll</param>
        /// <returns>TRUE->Erfolgreich gelöscht | FALSE->Fehler beim Löschen</returns>
        public override bool Delete(int id)
        {
            //Prüfen ob einem DynamicDataType die Kategorie zugeordnet ist, wenn nicht kann diese gelöscht werden.
            var dynamicDataTypeCount = (from eDynamicDataType in CurrentHttpContext.GetDataModel().EFDynamicDataTypeMenge where eDynamicDataType.DynamicDataTypeCategoryID == id select eDynamicDataType.ID).Count();

            if (dynamicDataTypeCount == 0)
            {
                DynamicDataTypeCategory dynamicDataTypeCategory = (DynamicDataTypeCategory)CurrentHttpContext.GetDataModel().EFCategoryMenge.Find(id);
                if (dynamicDataTypeCategory != null)
                {
                    if (!dynamicDataTypeCategory.IsSystem)
                    {
                        CurrentHttpContext.GetDataModel().EFCategoryMenge.Remove(dynamicDataTypeCategory);
                        CurrentHttpContext.GetDataModel().SaveChanges();

                        //anzeigen das die Kategorie erfolgreich gelöscht wurde
                        CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.DeleteSuccessFullRESX, MessageTypes.ok);
                        return true;
                    }
                    else
                    {
                        //Fehler anzeigen das die Kategorie nicht gelöscht werden kann, da es sich um eine Systemkategorie handelt.
                        CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.SystemValuesCanNotBeDeletedRESX, MessageTypes.error);
                    }
                }
            }
            else
            {
                //Fehler anzeigen das die Kategorie nicht gelöscht werden kann.
                CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.CategoryInUserErrorRESX, MessageTypes.error);
            }

            return false;
        }

        /// <summary>
        /// Bearbeiten der übergebenen Kategorie Id
        /// </summary>
        /// <param name="id">Kategorie Id die bearbeitet werden soll</param>
        /// <returns>das passende Model mit den hinterlegten Daten aus der DB | Null bei einem Fehler</returns>
        public override CategoriesAddModel Edit(int id)
        {
            //Laden der übergebenen Kategorie
            DynamicDataTypeCategory dynamicDataTypeCategory = (DynamicDataTypeCategory)CurrentHttpContext.GetDataModel().EFCategoryMenge.Find(id); 

            if (dynamicDataTypeCategory != null)
            {
                //Füllen des Modells mit den Daten und diese werden dann zurück gegeben und auf der Webseite angezeigt
                CategoriesAddModel categoriesAddModel = new CategoriesAddModel();
                categoriesAddModel.Name = dynamicDataTypeCategory.Name;
                categoriesAddModel.SortId = dynamicDataTypeCategory.SortId;
                return categoriesAddModel;
            }
            else
            {
                //Wenn ein Fehler beim Laden auftritt diesen anzeigen
                CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.LoadErrorRESX, MessageTypes.error);
            }

            return null;
        }

        /// <summary>
        /// Speichern der übergebenen Daten des geänderten Modells
        /// </summary>
        /// <param name="id">id die geändert werden soll</param>
        /// <param name="model">das Model mit den Daten die geändert werden sollen</param>
        /// <returns>TRUE->Änderung erfolgreich | FALSE->Daten konnten nicht geändert werden</returns>
        public override bool Edit(int id, CategoriesAddModel model)
        {
            //Laden der übergebenen Kategorie
            DynamicDataTypeCategory dynamicDataTypeCategory = (DynamicDataTypeCategory)CurrentHttpContext.GetDataModel().EFCategoryMenge.Find(id);
            if (dynamicDataTypeCategory != null)
            {
                //Prüfen ob der Name bereits vergeben wurde, bei einer anderen Kateogorie
                var count = (from eDataTypeCategory in CurrentHttpContext.GetDataModel().EFCategoryMenge.OfType<DynamicDataTypeCategory>() where eDataTypeCategory.Name == model.Name && eDataTypeCategory.ID != id select eDataTypeCategory).Count();
                if (count > 0)
                {
                    CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.DynamicDataTypeNameInUseRESX, MessageTypes.error);
                }
                else
                {
                    //die geladene Kategorie mit den Daten aus dem Model updaten und speichern
                    dynamicDataTypeCategory.Name = model.Name;
                    dynamicDataTypeCategory.SortId = model.SortId;
                    CurrentHttpContext.GetDataModel().SaveChanges();
                    CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.SaveSuccessfullRESX, MessageTypes.ok);
                    return true;
                }
            }
            else
            {
                //Wenn ein Fehler beim Laden auftritt diesen anzeigen
                CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.LoadErrorRESX, MessageTypes.error);
            }

            return false;
        }

        #endregion
    }
}